/*
 * Copyright (C) 2012 Christopher Eby <kreed@kreed.org>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package net.nullsum.audinaut.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;

import net.nullsum.audinaut.R;

/**
 * SeekBar preference to set the shake force threshold.
 */
public class SeekBarPreference extends DialogPreference implements SeekBar.OnSeekBarChangeListener {
    private final int mMin;
    private final int mMax;
    private final float mStepSize;
    /**
     * The current value.
     */
    private String mValue;
    private String mDisplay;

    /**
     * TextView to display current threshold.
     */
    private TextView mValueText;

    public SeekBarPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SeekBarPreference);
        mMin = a.getInteger(R.styleable.SeekBarPreference_min, 0);
        mMax = a.getInteger(R.styleable.SeekBarPreference_max, 100);
        mStepSize = a.getFloat(R.styleable.SeekBarPreference_stepSize, 1f);
        mDisplay = a.getString(R.styleable.SeekBarPreference_display);
        if (mDisplay == null) {
            mDisplay = "%.0f";
        }

        a.recycle();
    }

    @Override
    public CharSequence getSummary() {
        return getSummary(mValue);
    }

    @Override
    protected Object onGetDefaultValue(TypedArray a, int index) {
        return a.getString(index);
    }

    @Override
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        mValue = restoreValue ? getPersistedString((String) defaultValue) : (String) defaultValue;
    }

    /**
     * Create the summary for the given value.
     *
     * @param value The force threshold.
     * @return A string representation of the threshold.
     */
    private String getSummary(String value) {
        try {
            int val = Integer.parseInt(value);
            return String.format(mDisplay, (val + mMin) / mStepSize);
        } catch (Exception e) {
            return "";
        }
    }

    @Override
    protected View onCreateDialogView() {
        View view = super.onCreateDialogView();

        mValueText = view.findViewById(R.id.value);
        mValueText.setText(getSummary(mValue));

        SeekBar seekBar = view.findViewById(R.id.seek_bar);
        seekBar.setMax(mMax - mMin);
        try {
            seekBar.setProgress(Integer.parseInt(mValue));
        } catch (Exception e) {
            seekBar.setProgress(0);
        }
        seekBar.setOnSeekBarChangeListener(this);

        return view;
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        if (positiveResult) {
            persistString(mValue);
            notifyChanged();
        }
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (fromUser) {
            mValue = String.valueOf(progress);
            mValueText.setText(getSummary(mValue));
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
    }
}
